package pe.com.cotelasa.scp.entidad;

import java.io.Serializable;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Collection;
import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
 *
 * @author jeanpaul
 */
@Entity
@Table(name = "compra_facturacion", catalog = "bdcotelasa", schema = "cotelasa")
@NamedQueries({
    @NamedQuery(name = "CompraFacturacion.findAll", query = "SELECT f FROM CompraFacturacion f"),
    @NamedQuery(name = "CompraFacturacion.findById", query = "SELECT f FROM CompraFacturacion f WHERE f.id = :id"),
    @NamedQuery(name = "CompraFacturacion.findByNumeroFactura", query = "SELECT f FROM CompraFacturacion f WHERE f.numeroFactura = :numeroFactura"),
    @NamedQuery(name = "CompraFacturacion.findByTipoFactura", query = "SELECT f FROM CompraFacturacion f WHERE f.tipoFactura = :tipoFactura"),
    @NamedQuery(name = "CompraFacturacion.findBySerie", query = "SELECT f FROM CompraFacturacion f WHERE f.serie = :serie"),
    @NamedQuery(name = "CompraFacturacion.findByFecEmision", query = "SELECT f FROM CompraFacturacion f WHERE f.fecEmision = :fecEmision"),
    @NamedQuery(name = "CompraFacturacion.findByTipoPago", query = "SELECT f FROM CompraFacturacion f WHERE f.tipoPago = :tipoPago"),
    @NamedQuery(name = "CompraFacturacion.findByDiasPago", query = "SELECT f FROM CompraFacturacion f WHERE f.diasPago = :diasPago"),
    @NamedQuery(name = "CompraFacturacion.findByFecCancelacion", query = "SELECT f FROM CompraFacturacion f WHERE f.fecCancelacion = :fecCancelacion"),
    @NamedQuery(name = "CompraFacturacion.findByFecPagoEstimada", query = "SELECT f FROM CompraFacturacion f WHERE f.fecPagoEstimada = :fecPagoEstimada"),
    @NamedQuery(name = "CompraFacturacion.findBySubTotal", query = "SELECT f FROM CompraFacturacion f WHERE f.subTotal = :subTotal"),
    @NamedQuery(name = "CompraFacturacion.findByIgv", query = "SELECT f FROM CompraFacturacion f WHERE f.igv = :igv"),
    @NamedQuery(name = "CompraFacturacion.findByTotal", query = "SELECT f FROM CompraFacturacion f WHERE f.total = :total"),
    @NamedQuery(name = "CompraFacturacion.findByEstadoCancelacion", query = "SELECT f FROM CompraFacturacion f WHERE f.estadoCancelacion = :estadoCancelacion"),
    @NamedQuery(name = "CompraFacturacion.findByEstadoRegistro", query = "SELECT f FROM CompraFacturacion f WHERE f.estadoRegistro = :estadoRegistro"),
    @NamedQuery(name = "CompraFacturacion.findByUsrCreacion", query = "SELECT f FROM CompraFacturacion f WHERE f.usrCreacion = :usrCreacion"),
    @NamedQuery(name = "CompraFacturacion.findByFecCreacion", query = "SELECT f FROM CompraFacturacion f WHERE f.fecCreacion = :fecCreacion"),
    @NamedQuery(name = "CompraFacturacion.findByUsrModificacion", query = "SELECT f FROM CompraFacturacion f WHERE f.usrModificacion = :usrModificacion"),
    @NamedQuery(name = "CompraFacturacion.findByFecModificacion", query = "SELECT f FROM CompraFacturacion f WHERE f.fecModificacion = :fecModificacion")})
public class CompraFacturacion implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @SequenceGenerator(name = "generadorCompraFacturacion", sequenceName = "cotelasa.compra_facturacion_id_seq")
    @GeneratedValue(generator = "generadorCompraFacturacion")
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;
    
    @Column(name = "tipo_factura")
    private char tipoFactura;
    
    @Column(name = "serie_factura")
    private String serie;
    
    @Basic(optional = false)
    @Column(name = "numero_factura")
    private String numeroFactura;
    
    @Basic(optional = false)
    @Column(name = "fec_emision")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fecEmision;
  
    @Column(name = "tipo_pago")
    private String tipoPago;
    
    @Column(name = "dias_pago")
    private Integer diasPago;
    
    @Column(name = "comentario_pago")
    private String comentarioPago;
    
    @Basic(optional = false)
    @Column(name = "tipo_compago")
    private Integer tipoCompPago;
    
    @Column(name = "fec_cancelacion")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fecCancelacion;
    
    @Column(name = "fec_pago_estimada")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fecPagoEstimada;
    
    // @Max(value=?)  @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation
    @Column(name = "sub_total")
    private BigDecimal subTotal;
    
    @Column(name = "igv")
    private BigDecimal igv;
    
    @Column(name = "tipo_cambio")
    private BigDecimal tipoCambio;
    
    @Column(name = "total")
    private BigDecimal total;
    
    @Basic(optional = false)
    @Column(name = "estado_cancelacion")
    private char estadoCancelacion;
    
    @Basic(optional = false)
    @Column(name = "estado_registro")
    private char estadoRegistro;
    
    @Basic(optional = false)
    @Column(name = "usr_creacion")
    private String usrCreacion;
    
    @Basic(optional = false)
    @Column(name = "fec_creacion")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fecCreacion;
    
    @Column(name = "usr_modificacion")
    private String usrModificacion;
    
    @Column(name = "fec_modificacion")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fecModificacion;
    
    @Column(name = "fech_embarque")
    @Temporal(TemporalType.DATE)
    private Date fechEmbarque;
    
    @Column(name = "fech_llegada")
    @Temporal(TemporalType.DATE)
    private Date fechLlegada;
    
    @Column(name = "total_importacion")
    private BigDecimal totalImportacion;
    
    @Column(name = "valor_cfr")
    private BigDecimal valorCFR;
    
    @Column(name = "valor_cif")
    private BigDecimal valorCIF;
    
    @Column(name = "num_bultos")
    private String numBultos;
    
    @Column(name = "puerto_origen")
    private String puertoOrigen;
    
    @Column(name = "embarcado")
    private String embarcado;
    
    @Column(name = "puerto_destino")
    private String puertoDestino;
    
    @JoinColumn(name = "id_proveedor", referencedColumnName = "id")
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private Proveedor idProveedor;
    
    @JoinColumn(name = "id_cliente", referencedColumnName = "id")
    @ManyToOne(fetch = FetchType.LAZY)
    private Cliente idCliente;
    
    @JoinColumn(name = "id_orden_pedido", referencedColumnName = "id")
    @ManyToOne(fetch = FetchType.LAZY)
    private OrdenPedido idOrdenPedido;
    
    @JoinColumn(name = "id_orden_compra_servicio", referencedColumnName = "id")
    @ManyToOne(fetch = FetchType.LAZY)
    private OrdenCompraServicio idOrdenCompraServicio;
    
    @JoinColumn(name = "id_tipo_moneda", referencedColumnName = "id")
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private TipoMoneda idTipoMoneda;
    
    @JoinColumn(name = "id_empresa", referencedColumnName = "id")
    @ManyToOne(optional = false,fetch=FetchType.LAZY)
    //@LazyCollection(LazyCollectionOption.FALSE)
    private Empresa idEmpresa;
    
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "idFactura", fetch = FetchType.LAZY)
    private Collection<DetalleCompraFacturacion> detalleFacturaCollection;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "idFactura", fetch = FetchType.LAZY)
    private Collection<GuiaRemision> guiaRemisionCollection;
    
    @JoinColumn(name = "id_forma_pago", referencedColumnName = "id")
    @ManyToOne(optional = false,fetch=FetchType.LAZY)
    private TipoFormaPago formaPago;
    
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "idFacturaCompra", fetch = FetchType.LAZY)
    private Collection<CosteoImportacion> costeoImportacionCollection;
    
    public CompraFacturacion() {
    	idProveedor = new Proveedor();
    	idTipoMoneda = new TipoMoneda();
    }

    public CompraFacturacion(Integer id) {
        this.id = id;
    }

    public CompraFacturacion(Integer id, String numeroFactura, Date fecEmision, char estadoRegistro, String usrCreacion, Date fecCreacion) {
        this.id = id;
        this.numeroFactura = numeroFactura;
        this.fecEmision = fecEmision;
        this.estadoRegistro = estadoRegistro;
        this.usrCreacion = usrCreacion;
        this.fecCreacion = fecCreacion;
    }

    public String getSerie() {
        return serie;
    }

    public void setSerie(String serie) {
        this.serie = serie;
    }

    public TipoMoneda getIdTipoMoneda() {
        return idTipoMoneda;
    }

    public void setIdTipoMoneda(TipoMoneda idTipoMoneda) {
        this.idTipoMoneda = idTipoMoneda;
    }

    public Collection<GuiaRemision> getGuiaRemisionCollection() {
        return guiaRemisionCollection;
    }

    public void setGuiaRemisionCollection(Collection<GuiaRemision> guiaRemisionCollection) {
        this.guiaRemisionCollection = guiaRemisionCollection;
    }

    public char getTipoFactura() {
        return tipoFactura;
    }

    public void setTipoFactura(char tipoFactura) {
        this.tipoFactura = tipoFactura;
    }

    public String getTipoPago() {
        return tipoPago;
    }

    public void setTipoPago(String tipoPago) {
        this.tipoPago = tipoPago;
    }


    public Date getFecPagoEstimada() {
        return fecPagoEstimada;
    }

    public void setFecPagoEstimada(Date fecPagoEstimada) {
        this.fecPagoEstimada = fecPagoEstimada;
    }

    public Integer getDiasPago() {
        return diasPago;
    }

    public void setDiasPago(Integer diasPago) {
        this.diasPago = diasPago;
    }

    public Empresa getIdEmpresa() {
        return idEmpresa;
    }

    public void setIdEmpresa(Empresa idEmpresa) {
        this.idEmpresa = idEmpresa;
    }

    public Integer getTipoCompPago() {
        return tipoCompPago;
    }

    public void setTipoCompPago(Integer tipoCompPago) {
        this.tipoCompPago = tipoCompPago;
    }

    public TipoFormaPago getFormaPago() {
        return formaPago;
    }

    public void setFormaPago(TipoFormaPago formaPago) {
        this.formaPago = formaPago;
    }

    public String getComentarioPago() {
        return comentarioPago;
    }

    public void setComentarioPago(String comentarioPago) {
        this.comentarioPago = comentarioPago;
    }

    public BigDecimal getTipoCambio() {
        return tipoCambio;
    }

    public void setTipoCambio(BigDecimal tipoCambio) {
        this.tipoCambio = tipoCambio;
    }

    public Date getFechEmbarque() {
        return fechEmbarque;
    }

    public void setFechEmbarque(Date fechEmbarque) {
        this.fechEmbarque = fechEmbarque;
    }

    public Date getFechLlegada() {
        return fechLlegada;
    }

    public void setFechLlegada(Date fechLlegada) {
        this.fechLlegada = fechLlegada;
    }

    public BigDecimal getTotalImportacion() {
        return totalImportacion;
    }

    public void setTotalImportacion(BigDecimal totalImportacion) {
        this.totalImportacion = totalImportacion;
    }

    public BigDecimal getValorCFR() {
        return valorCFR;
    }

    public void setValorCFR(BigDecimal valorCFR) {
        this.valorCFR = valorCFR;
    }

    public BigDecimal getValorCIF() {
        return valorCIF;
    }

    public void setValorCIF(BigDecimal valorCIF) {
        this.valorCIF = valorCIF;
    }

    public String getNumBultos() {
        return numBultos;
    }

    public void setNumBultos(String numBultos) {
        this.numBultos = numBultos;
    }

    public String getPuertoOrigen() {
        return puertoOrigen;
    }

    public void setPuertoOrigen(String puertoOrigen) {
        this.puertoOrigen = puertoOrigen;
    }

    public String getEmbarcado() {
        return embarcado;
    }

    public void setEmbarcado(String embarcado) {
        this.embarcado = embarcado;
    }

    public String getPuertoDestino() {
        return puertoDestino;
    }

    public void setPuertoDestino(String puertoDestino) {
        this.puertoDestino = puertoDestino;
    }

    public enum ESTADO_GUIA_REMISION {

        PAGADO('P'), POR_PAGAR('N');
        private char estado;

        private ESTADO_GUIA_REMISION(char estado) {
            this.estado = estado;
        }

        public char getValor() {
            return estado;
        }
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getNumeroFactura() {
        return numeroFactura;
    }

    public void setNumeroFactura(String numeroFactura) {
        this.numeroFactura = numeroFactura;
    }

    public Date getFecEmision() {
        return fecEmision;
    }

    public void setFecEmision(Date fecEmision) {
        this.fecEmision = fecEmision;
    }

    public Date getFecCancelacion() {
        return fecCancelacion;
    }

    public void setFecCancelacion(Date fecCancelacion) {
        this.fecCancelacion = fecCancelacion;
    }

    public BigDecimal getSubTotal() {
        return subTotal;
    }

    public void setSubTotal(BigDecimal subTotal) {
        this.subTotal = subTotal;
    }

    public BigDecimal getIgv() {
        return igv;
    }

    public void setIgv(BigDecimal igv) {
        this.igv = igv;
    }

    public BigDecimal getTotal() {
        return total;
    }

    public void setTotal(BigDecimal total) {
        this.total = total;
    }

    public char getEstadoRegistro() {
        return estadoRegistro;
    }

    public void setEstadoRegistro(char estadoRegistro) {
        this.estadoRegistro = estadoRegistro;
    }

    public String getUsrCreacion() {
        return usrCreacion;
    }

    public void setUsrCreacion(String usrCreacion) {
        this.usrCreacion = usrCreacion;
    }

    public Date getFecCreacion() {
        return fecCreacion;
    }

    public void setFecCreacion(Date fecCreacion) {
        this.fecCreacion = fecCreacion;
    }

    public String getUsrModificacion() {
        return usrModificacion;
    }

    public void setUsrModificacion(String usrModificacion) {
        this.usrModificacion = usrModificacion;
    }

    public Date getFecModificacion() {
        return fecModificacion;
    }

    public void setFecModificacion(Date fecModificacion) {
        this.fecModificacion = fecModificacion;
    }

    public Proveedor getIdProveedor() {
        return idProveedor;
    }

    public void setIdProveedor(Proveedor idProveedor) {
        this.idProveedor = idProveedor;
    }

    public Cliente getIdCliente() {
        return idCliente;
    }

    public void setIdCliente(Cliente idCliente) {
        this.idCliente = idCliente;
    }

    public Collection<DetalleCompraFacturacion> getDetalleFacturaCollection() {
        return detalleFacturaCollection;
    }

    public void setDetalleFacturaCollection(Collection<DetalleCompraFacturacion> detalleFacturaCollection) {
        this.detalleFacturaCollection = detalleFacturaCollection;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof CompraFacturacion)) {
            return false;
        }
        CompraFacturacion other = (CompraFacturacion) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "pe.com.cotelasa.scp.entidad.CompraFacturacion[ id=" + id + " ]";
    }

    public OrdenPedido getIdOrdenPedido() {
        return idOrdenPedido;
    }

    public void setIdOrdenPedido(OrdenPedido idOrdenPedido) {
        this.idOrdenPedido = idOrdenPedido;
    }

    public OrdenCompraServicio getIdOrdenCompraServicio() {
        return idOrdenCompraServicio;
    }

    public void setIdOrdenCompraServicio(OrdenCompraServicio idOrdenCompraServicio) {
        this.idOrdenCompraServicio = idOrdenCompraServicio;
    }

    public char getEstadoCancelacion() {
        return estadoCancelacion;
    }

    public void setEstadoCancelacion(char estadoCancelacion) {
        this.estadoCancelacion = estadoCancelacion;
    }

    public Collection<CosteoImportacion> getCosteoImportacionCollection() {
        return costeoImportacionCollection;
    }

    public void setCosteoImportacionCollection(Collection<CosteoImportacion> costeoImportacionCollection) {
        this.costeoImportacionCollection = costeoImportacionCollection;
    }
}
